/**
 * Created by Administrator on 2017/2/4.
 */
//div对象
(function(window) {
    var utils = window.utils || {};
    window.utils = utils || window.utils;
    //获取min-max的随机值
    utils.getRandom = function(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    };
    /*
     * 绘制正弦函数
     * @params ctx 'Object' 画笔
     * @params x 'Number' 起点x坐标
     * @params y 'Number' 起点y坐标
     * @return l 'Number' 宽度
     * @return r 'Number' 正弦函数的振幅
     * */
    utils.curveSin = function(ctx, x, y, l, r) {
        var maxWidth = x + l;
        ctx.save();
        ctx.beginPath();
        ctx.moveTo(x, y);
        for(; x <  maxWidth; x++){
            ctx.lineTo(x, -r * Math.sin((x-100)*Math.PI/180) + y)
        }
        ctx.stroke();
        ctx.restore();
    };

    /*
     * 绘制椭圆方法
     * @params ctx 'Object' 画笔
     * @params x 'Number' 起点x坐标
     * @params y 'Number' 起点y坐标
     * @return a 'Number' 椭圆一个半径
     * @return b 'Number' 椭圆另一个半径
     * */
    utils.ellipse = function(ctx, x, y, a, b) {
        ctx.save();
        var r = (a > b) ? a : b;
        var ratioX = a / r;
        var ratioY = b / r;
        ctx.scale(ratioX, ratioY);
        ctx.arc(x / ratioX, y / ratioY, r, 0, 2 * Math.PI, false);
        ctx.closePath();
        ctx.restore();
    };

    /*
     * 绘制扇形方法
     * @params ctx 'Object' 画笔
     * @params x 'Number' 起点x坐标
     * @params y 'Number' 起点y坐标
     * @params r 'Number' 变径
     * @return sDeg 'Number' 起始角度
     * @return eDeg 'Number' 结束角度
     * */
    utils.sector = function (ctx, x, y, r, sDeg, eDeg) {
        // 初始保存
        ctx.save();
        // 位移到目标点
        ctx.translate(x, y);
        ctx.beginPath();
        // 画出圆弧
        ctx.arc(0, 0, r, sDeg, eDeg);
        // 再次保存以备旋转
        ctx.save();
        // 旋转至起始角度
        ctx.rotate(eDeg);
        // 移动到终点，准备连接终点与圆心
        ctx.moveTo(r, 0);
        // 连接到圆心
        ctx.lineTo(0, 0);
        // 还原
        ctx.restore();
        // 旋转至起点角度
        ctx.rotate(sDeg);
        // 从圆心连接到起点
        ctx.lineTo(r, 0);
        ctx.closePath();
        // 还原到最初保存的状态
        ctx.restore();
    };
    utils.drawCloud = function(ctx, x, y, r) {
        ctx.save();
        ctx.moveTo(0, 0);
        ctx.beginPath();
        for(var i = -1; i< 2; i++){
            var r1 = r + 0.1*r;
            var r2 = 0.7 * r - Math.abs(i * (0.2 * r)) + 0.1*r;//r2的最大值1.6 * r
            //var r1 = r + utils.getRandom(1, 0.2 * r);
            //var r2 = 0.7 * r - Math.abs(i * (0.2 * r)) + utils.getRandom(1, 0.1 * r);//r2的最大值1.6 * r
            //为了让三个椭圆的底部对齐，所以y轴的坐标为   中心点的y坐标 加上 r2的最大值与r2的差值
            utils.ellipse(ctx, x + r1, y + (1.6 * r - r2), r1, r2);
            x += r1/2;
        }
        ctx.closePath();
        ctx.fillStyle = "white";
        ctx.fill();
        ctx.restore();
    };
    utils.drawBalloon = function(ctx, x, y, r, fillStyle, strokeStyle , deg){
        if(typeof deg != "number"){
            deg = 0;
        }
        var d = Math.PI/180;
        ctx.save();
        ctx.translate(x, y);
        // 旋转至起始角度
        ctx.rotate(deg * d);
        ctx.translate(-x, -y);
        //绘制气球线
        ctx.lineCap = "round";
        ctx.strokeStyle = "#ffffff";
        ctx.beginPath();
        ctx.moveTo(x, y + r);
        ctx.quadraticCurveTo(x - 0.25 * r, y + (2.4)*r, x + 0.5*r, y + 3*r);
        ctx.lineWidth = 2;
        ctx.stroke();
        //绘制气球线接口
        ctx.beginPath();
        ctx.strokeStyle = strokeStyle;
        utils.sector(ctx, x, y + 0.8 * r, 0.4 * r, 60*d, 120*d);
        ctx.stroke();
        ctx.fillStyle = fillStyle;
        ctx.fill();
        //绘制气球
        ctx.strokeStyle = strokeStyle;
        ctx.beginPath();
        ctx.arc(x, y, r, 0, 2*Math.PI);
        ctx.stroke();
        ctx.fillStyle = fillStyle;
        ctx.fill();
        //绘制气球亮点
        ctx.strokeStyle = "#ffffff";
        ctx.beginPath();
        ctx.arc(x - 0.4*r, y - 0.4*r, 0.3*r, 0, 2*Math.PI);
        ctx.stroke();
        ctx.fillStyle="#ffffff";
        ctx.fill();
        ctx.beginPath();
        ctx.arc(x - 0.7*r, y, 0.15*r, 0, 2*Math.PI);
        ctx.stroke();
        ctx.fill();
        ctx.restore();
    }
})(window);
/*
 * 缓动函数
 * @params A 'Number' 起始位置
 * @params B 'Number' 目标位置
 * @params rate 'Number' 缓动速率，取值范围0-1,值越大越快
 * @return 目标此时的位置
 * */
var easeMove = function (A, B, rate) {
    if (A == B || typeof A != 'number') {
        return;
    }
    B = B || 0;
    rate = rate || 0.5;
    A = A + (B - A) * rate;
    return A;
};

/*
 * 圆里随机生成一个点
 * @params x 'Number' 圆心X轴坐标
 * @params y 'Number' 圆心Y轴坐标
 * @params r 'Number' 圆的半径
 * @return Object 包含：ang: 角度; x: X轴坐标; y: Y轴坐标
 * */
var dotInCircle = function(x, y, r){
    //均匀分布
    //var x1 = utils.getRandom(x - r, x + r);
    //var distanceX = Math.abs(x1 - x);
    //var distanceY = Math.sqrt(r*r - distanceX*distanceX);
    //var y1 = utils.getRandom(y - Math.floor(distanceY), y + Math.floor(distanceY));
    //return {
    //    x: x1,
    //    y: y1
    //}

    //越靠近圆心点分布的机率越大
    var ang = utils.getRandom(0, 360)/180*Math.PI;
    var r1 = utils.getRandom(0, r);
    return {
        ang: ang,
        x: x + r1*Math.cos(ang),
        y: y + r1*Math.sin(ang)
    }
};